// 【any】
// !如果用了 any 其实和写 JS 没啥差别，失去了类型保护的功能，一般不用
/* let num: any = 8
num = '9'
num.toFixed(2) */

// 声明变量不提供类型也不提供默认值
// let age

// 函数参数不加类型
/* const sum = (a, b) => {
  return a + b
} */


// unknown 它是更加安全的 any 类型，会导致 JS 运行崩溃的错误会报出来
/* let num: unknown = 8
num = '9'
num.toFixed(2) */

// !unknown 往往配合类型收窄来做一些处理
/* let num: unknown = 88

// typeof 就是常见的类型收窄的一种手段
if(typeof num === 'number') {
  num.toFixed(2)
} else if(typeof num === 'function') {
  num()
} */

// !并不是所有的类型都能进行“收窄”，例如下面写法把 string 收窄为了 function，怎么可能存在呢？
/* let num = 'hello' // num 的类型已经确定就是 string 类型
if (typeof num === 'string') {
  console.log(num.length)
} else if (typeof num === 'function') {
  // 如果再等于了 function 类型，那是不可能的，所以 num 被推断为了 never 类型
  num()
} */

// unknown 常常配合类型断言去使用
// let age: number | string
let age: unknown

// 如果这一步你想用 number 相关的提示或校验的能力，可以使用断言
// 可以把一个联合类型断言为一个更加具体的类型
const r = (age as number).toFixed(2)

export { }